package san.java.day10;

import jdk.nashorn.internal.ir.IdentNode;

import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;

/**
 * Java集合: 存放于java.util包中,是一个用来存放对象的容器.
 *  1. 集合只能存对象,不能存基本数据类型
 *  2. 集合存放的是多个对象的引用,对象本身还是存放在堆内存中.
 *  3. 集合可以存放不同类型,不限数量的数据类型.
 *
 * Java集合可分为Set, List和Map三种大体系
 *  1. Set: 无序,不可重复的集合
 *  2. List: 有序,可重复的集合
 *  3. Map: 具有映射关系的集合
 *
 *  Set接口:  HashSet ---> Set ---> Collection
 *      HashSet按 Hash 算法来存储集合中的元素,因此具有很好的存取和查找性能.
 *          HashSet的特点:
 *              1. 不能保证元素的排列顺序
 *              2. 不可重复
 *              3. HashSet不是线程安全的
 *              4. 集合元素可以是null
 *
 *          HashSet是如何保存元素的:
 *              1. 当向 HashSet 集合中存入一个元素时,HashSet会调用该对象的hashCode()方法来得到该对象的hashCode 值,
 *                  然后根据hashCode值决定该对象在HashSet中的存储位置
 *              2. 当两个元素的equals()方法返回true, 但它们的hashCode()返回值不相等,hashSet将会把他们存储在不同的位置,
 *                  此时仍然可以添加成功
 *  注意:
 *      1. 在JDK5之后, 增加了泛型,Java集合可以记住容器中对象的数据类型
 *      2. HashSet中判断两个元素相等的标准: 两个对象通过equals()方法比较相等,并且两个对象的hashCode()方法的返回值也相等
 */

public class HashSet_04 {
    public static void main(String[] args) {
        Set<Object> set = new HashSet<Object>();
        set.add(1);
        set.add("a");
        set.remove(1);

        System.out.println(set);
        System.out.println(set.contains(1));
        set.clear();

        set.add(1);
        set.add("a");
        set.add(3);
        set.add(null);

        // 使用迭代器遍历
        Iterator<Object> iter = set.iterator();
        while (iter.hasNext()) {
            System.out.println(iter.next());
        }

        // for each 基于范围的for循环
        for (Object obj: set) {
            System.out.println(obj);
        }

        // 获取集合的元素个数
        System.out.println(set.size());

        // 泛型:
        Set<Integer> iSet = new HashSet<Integer>();
    }
}
